package StackSecond.SwordOffer;

import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;

import java.util.Stack;

public class EvalRPN {
    /**
     * 剑指 Offer II 036. 后缀表达式
     * 根据 逆波兰表示法，求该后缀表达式的计算结果。
     * 有效的算符包括 +、-、*、/ 。每个运算对象可以是整数，也可以是另一个逆波兰表达式。
     * <p>
     * 说明：
     * 整数除法只保留整数部分。
     * 给定逆波兰表达式总是有效的。换句话说，表达式总会得出有效数值且不存在除数为 0 的情况。
     * <p>
     * 示例 1：
     * <p>
     * 输入：tokens = ["2","1","+","3","*"]
     * 输出：9
     * 解释：该算式转化为常见的中缀算术表达式为：((2 + 1) * 3) = 9
     *
     * @param tokens
     * @return
     */
    public static int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<>();
        int i;
        int j;
        for (String token : tokens) {
            switch (token) {
                case "+":
                    i = stack.pop();
                    j = stack.pop();
                    stack.push(j + i);
                    break;
                case "-":
                    i = stack.pop();
                    j = stack.pop();
                    stack.push(j - i);
                    break;
                case "*":
                    i = stack.pop();
                    j = stack.pop();
                    stack.push(j * i);
                    break;
                case "/":
                    i = stack.pop();
                    j = stack.pop();
                    stack.push(j / i);
                    break;
                default:
                    stack.push(Integer.parseInt(token));
            }
        }
        return stack.peek();
    }


    public static void main(String[] args) {

        int i = evalRPN(new String[]{"2", "1", "+", "3", "*"});
        System.out.println(i);
    }
}
